//#include <iostream>
//#include <algorithm>
//using namespace std;
//
//const int N = 1010;
//
//struct node
//{
//	int idx;
//	double num;
//}e[N];
//
//int n;
//
//int main()
//{
//	cin >> n;
//	double sum = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> e[i].num;
//		e[i].idx = i;
//	}
//
//	sort(e + 1, e + 1 + n, [](node& a, node& b)->bool { return a.num < b.num; });
//
//	for (int i = 1; i <= n; i++)
//	{
//		cout << e[i].idx << " ";
//		sum += (n - i) * e[i].num;
//	}
//	printf("\n%.2lf", sum / n);
//
//	return 0;
//}



//#include <iostream>
//#include <vector>
//using namespace std;
//
//const int N = 30;
//
//int v[N] = { 0 };
//int g[N][N] = { 0 };
//int p[N] = { 0 };
//bool st[N] = { 0 };
//
//int ret = 0x3f3f3f3f;
//int cnt = 0;
//vector<int> rets;
//vector<int> path;
//
//int n, m;
//
//bool check()
//{
//	bool flag = 1;
//	for (int i = 1; i <= n; i++)
//	{
//		if (p[i] < v[i])
//		{
//			flag = 0;
//		}
//	}
//
//	return flag;
//}
//
//void add(int x)
//{
//	for (int i = 1; i <= n; i++)
//	{
//		p[i] += g[x][i];
//	}
//}
//
//void sub(int x)
//{
//	for (int i = 1; i <= n; i++)
//	{
//		p[i] -= g[x][i];
//	}
//}
//
//void dfs(int x)
//{
//	if (check())
//	{
//		if (cnt < ret)
//		{
//			ret = cnt;
//
//			rets.clear();
//			for (auto ch : path)
//			{
//				rets.push_back(ch);
//			}
//		}
//
//		return;
//	}
//
//	if (cnt >= ret)
//		return;
//
//	for (int i = x + 1; i <= m; i++)
//	{
//		add(i);
//		cnt++;
//		path.push_back(i);
//		dfs(i);
//		path.pop_back();
//		cnt--;
//		sub(i);
//	}
//
//	return;
//}
//
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> v[i];
//	}
//
//	cin >> m;
//	for (int i = 1; i <= m; i++)
//	{
//		for (int j = 1; j <= n; j++)
//		{
//			cin >> g[i][j];
//		}
//	}
//
//	for (int i = 1; i <= m; i++)
//	{
//		add(i);
//		cnt++;
//		path.push_back(i);
//		dfs(i);
//		path.pop_back();
//		cnt--;
//		sub(i);
//	}
//
//	cout << ret << endl;;
//	for (auto ch : rets)
//	{
//		cout << ch << " ";
//	}
//
//	return 0;
//}


#include <iostream>
#include <string>
using namespace std;

const int N = 1010;
const int M = 10010;

int a[N] = { 0 };
int f[N][M] = { 0 };

int n;

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int x;
		int y;
		cin >> x >> y;
		a[i] = x - y;
	}

	int m = 5 * n;

	memset(f, 0x3f, sizeof(f));
	f[0][0 + m] = 0;

	for (int i = 1; i <= n; i++)
	{
		for (int j = -m; j <= m; j++)
		{
			f[i][j + m] = min(f[i - 1][j - a[i] + m], f[i - 1][j + a[i] + m] + 1);
		}
	}


	int ret = 0x3f3f3f3f;
	for (int i = 0; i <= m; i++)
	{
		ret = min(abs(f[n][i + m]), abs(f[n][-i + m]));
		if (ret != 0x3f3f3f3f)
		{
			cout << ret << endl;
			break;
		}
	}

	return 0;
}